package com.dynamic.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: WFP
 * @Time: 2017/12/25
 * @decription: 调用处理器
 */
public class MyInvocationHandler<T> implements InvocationHandler {

    //目标对象
    T target;

    /**
     * 构造方法
     * @param target 目标对象
     */
    public MyInvocationHandler(T target){
        this.target = target;
    }

    /**
     * 执行目标对象的方法
     * @param proxy 代表动态代理堆
     * @param method 代表正在执行的方法
     * @param objects 代表调用目标方法时传入的参数
     * @return
     * @throws Throwable
     */

    public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
        //在目标对象的方法执行前操作
        System.out.println("before");
        System.out.println("代理执行："+method.getName()+"方法");

        //执行目标对象的方法
        Object result = method.invoke(target,objects);

        //在目标对象的方法执行后的操作
        System.out.println("after");
        return null;
    }

    /**
     * 获取目标对象的代理对象
     * @return 代理对象
     */
    public T getProxy(){
        /**
         * loader - 类加载器来定义代理类。
         * interfaces - 代理类实现的接口列表。
         * h - 调度处理程序调度方法调用。
         * return 一个代理实例，它是具有由指定的类加载器定义并实现指定接口的代理类的指定调用处理程序的代理实例。
         */
        return (T)Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),target.getClass().getInterfaces(),this);
    }
}
